import urllib.request  # 导入request子模块
import urllib.parse
import urllib.error  # 导入urllib.error模块
import socket  # 导入socket模块

import http.cookiejar  # 导入http.cookiejar子模块

import json  # 导入json模块
import requests
import re

password = 'dream010923**'
"""
# response = urllib.request.urlopen('https://www.baidu.com/')
# print('响应数据类型:', type(response))

url = 'https://www.python.org/'
response1 = urllib.request.urlopen(url=url)
print('响应状态码为:', response1.status)
print('响应状态码为:', response1.status)
print('响应头所有信息为:', response1.getheaders())
print('响应头指定信息为:', response1.getheader('Accept-Ranges'))  # 读取HTML代码并进行UTF-8解码
print('Python官网HTML代码如下:\n', response1.read().decode('utf-8'))
url = 'https://www.httpbin.org/post'  # POST请求测试地址
# 将表单数据转换为bytes类型，并设置编码方式为UTF-8
input = bytes(urllib.parse.urlencode({'hello': 'python'}), encoding='utf-8')
response2 = urllib.request.urlopen(url=url, input=input)  # 发送网络请求
print(response2.read().decode('utf-8'))  # 读取HTML代码并进行

#异常处理
url = 'https://www.python.org/'  # 请求地址
response3 = urllib.request.urlopen(url=url, timeout=0.1)  # 发送网络请求，设置超时时间为0.1利
print(response3.read().decode('utf-8'))  # 读取HTML代码并进行UTF-8解码

url = 'https://www.python.org/'  # 请求地址
try:
    # 发送网络请求，设置超时时间为0.1秒
    response4 = urllib.request.urlopen(url=url, timeout=0.1)
    print(response4.read().decode('utf - 8'))  # 读取HTML代码并进行UTF-8解码
except urllib.error.URLError as error:  # 处理异常
    if isinstance(error.reason, socket.timeout):  # 判断异常是否为超时异常
        print('当前任务已超时，即将执行下一任务!')
        
url = 'https://www.httpbin.org/post'  # 请求地址
# 定义请求头信息
headers = {
    'User-Agent': 'Mozilla/5.0(Windows NT 10.0; WOW64) '
                  ' AppleWebKit/537.36(KHTML, like Gecko) '
                  'Chrome/83.0.4103.61 Safari/537.36'}  # 将表单数据转换为bytes类型，并设置编码方式为UTF-8
input = bytes(urllib.parse.urlencode({'hello': 'python'}), encoding='utf-8')  # 创建Request对象
r = urllib.request.Request(url=url, input=input, headers=headers, method='POST')
response = urllib.request.urlopen(r)  # 发送网络请求
print(response.read().decode('utf-8'))  # 读取HTML代码并进行UTF-8解码


url = 'https://www.baidu.com/'  # 请求地址
# 定义请求头信息
headers = {
    'User-Agent': 'Mozilla/5.0(Windows NT 10.0; WOW64) ApplewebKit/537.36(KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}  # 创建Request对象
r = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(r)  # 发送网络请求	
print(response.read().decode('utf-8'))  # 读取HTML代码并进行UTF-8解码

import urllib.request  # 导入urllib.request模块
import urllib.parse  # 导入urllib.parse模块

url = 'https://gitee.com/login'  # 登录请求地址# 将表单数据转换为bytes类型，并设置编码方式为UTF-8
input = bytes(urllib.parse.urlencode({'user[login]': '15839487904', 'user[password]': '11'}),
             encoding='utf-8')  # 创建Request对象
r = urllib.request.Request(url=url, input=input, method='POST')
response = urllib.request.urlopen(r)  # 发送网络请求
print(response.read().decode('utf-8'))  # 读取HTML代码并进行UTF-8解码


url = 'https://gitee.com/login'  # 登录请求地址# 将表单数据转换为bytes类型，并设置编码方式为UTF-8
input = bytes(urllib.parse.urlencode({'user[login]': '15839487904', 'user[password]': password}),
             encoding='utf-8')  # 创建Request对象
cookie = http.cookiejar.CookieJar()  # 创建CookieJar对象
cookie_processor = urllib.request.HTTPCookieProcessor(cookie)  # 生成Cookie处理器
opener = urllib.request.build_opener(cookie_processor)  # 创建opener对象
response = opener.open(url, input=input)  # 发送登录请求
response = json.loads(response.read().decode('utf-8'))['msg']
if response == '登录成功!':
    for i in cookie:  # 循环遍历Cookie内容
        print(i.name + '=' + i.value)  # 打印登录成功的Cookie信息
        
url ='https://gitee.com/login'# 登录请求地址# 将表单数据转换为bytes类型，并设置编码方式为UTF-8
input=bytes(urllib.parse.urlencode({'username': 'mrsoft', 'password': 'mrsoft'}),encoding='utf-8')
cookie_file = 'cookie.txt'	# 保存Cookie文件
cookie=http.cookiejar.LWPCookieJar(cookie_file)	#创建LWPCookieJar对象
#生成cookie处理器
cookie_processor=urllib.request.HTTPCookieProcessor(cookie)#创建opener对象
opener =urllib.request.build_opener(cookie_processor)
response=opener.open(url,input=input)	#发送网络请求
response=json.loads(response.read().decode('utf-8'))['msg']
if response=='登录成功!':
    cookie.save(ignore_discard=True, ignore_expires=True)# 保存Cookie文件
    
#登录后页面的请求地址
url ='https://gitee.com/login'
cookie_file = 'cookie.txt'	# Cookie文件	
cookie=http.cookieiarLWPCookieJar()	#创建LWPCookieJar对象	
# 读取Cookie文件内容
cookie.load(cookie_file,ignore_expires=True,ignore_discard=True)#生成Cookie处理器
handler=urllib.request.HTTPCookieProcessor(cookie)#创建opener对象
opener =urllib.requestbuild_opener(handler)
response=opener.open(url)	#发送网络请求	
print(response.read().decode('utf-8'))	# 打印登录后页面的HTML代码      



url='https://www.httpbin.org/get'	#网络请求地址
#创建代理IP
proxy_handler=urllib.request.ProxyHandler({'https':'58.220.95.114:10053'})
#创建opener对象
opener =urllib.request.build_opener(proxy_handler)
response=opener.open(url,timeout=2)#发送网络请求
print(response.read().decode('utf-8')) #打印返回内容  


try:
    # 向不存在的网络地址发送请求
    response=urllib.request.urlopen('http://site2.rjkflm.com:666/123index.html')
except urllib.error.URLError as error:# 捕获异常信息
    print(error.reason)	# 打印异常原因
    
try:
    #向不存在的网络地址发送请求
    response=urllib.request.urlopen('http://site2.rjkflm.com:666/123index.html')
    print(response.status)
except urllib.error.HTTPError as error:	# 捕获异常信息
    print('状态码为:',error.code)	#打印状态码
    print('异常信息为:',error.reason)	#打印异常原因
    print('请求头信息如下:\n',error.headers)	#打印请求头
    
    
try:
    # 向不存在的网络地址发送请求
    response=urllib.request.urlopen('https://www.python.org/',timeout=0.1)
except urllib.error.HTTPError as error:	#HTTPError捕获异常信息
    print('状态码为:',error.code)	#打印状态码
    print('HTTPError异常信息为:',error.reason)# 打印异常原因
    print('请求头信息如下:\n',error.headers)	# 打印请求头
except urllib.error.URLError as error:	#URLError捕获异常信息
    print('URLError异常信息为:',error.reason)
"""

"""
parse_result = urllib.parse.urlparse('https://docs.python.org/3/library/urllib.parse.html')
print(type(parse_result))  # 打印类型
print(parse_result)  # 打印拆分后的结果

print('scheme值为:', parse_result.scheme)
print('netloc值为:', parse_result.netloc)
print('path值为:', parse_result.path)
print('params值为:', parse_result.params)
print('query值为:', parse_result.query)
print('fragment值为:', parse_result.fragment)

# 需要拆分的URL
url = 'https://docs.python.org/3/library/urllib.parse.html'
print(urllib.parse.urlsplit(url))  # 使用urlsplit()方法拆分URL
print(urllib.parse.urlparse(url))  # 使用urlparse()方法拆分URL

# 需要拆分的URL
url = 'https://docs.python.org/3/library/urllib.parse.html'
urlsplit = urllib.parse.urlsplit(url)  # 拆分URL
print(urlsplit.scheme)  # 属性获取拆分后协议值
print(urlsplit[0])  # 索引获取拆分后协议值

list_url = ['https', 'docs.python.org', '/3/library/urllib.parse.html', ",", ","]
tuple_url = ('https', 'docs.python.org', '/3/library/urllib.parse.html', ",", ",")
dict_url = {'scheme': 'https', 'netloc': 'docs.python.org', 'path': '/3/library/urllib.parse.html', 'params': '',
            'query': '', 'fragment': ''}
print('组合列表类型的URL:', urllib.parse.urlunparse(list_url))
print('组合元组类型的URL:', urllib.parse.urlunparse(tuple_url))
print('组合字典类型的URL:', urllib.parse.urlunparse(dict_url.values()))

list_url = ['https', 'docs.python.org', '/3/library/urllib.parse.html', ","]
tuple_url = ('https', 'docs.python.org', '/3/library/urllib.parse.html', ",")
dict_url = {'scheme': 'https', 'netloc': 'docs.python.org', 'path': '/3/library/urllib. parse.html', 'query': '',
            'fragment': ''}
print('组合列表类型的URL:', urllib.parse.urlunsplit(list_url))
print('组合元组类型的URL:', urllib.parse.urlunsplit(tuple_url))
print('组合字典类型的URL:', urllib.parse.urlunsplit(dict_url.values()))

base_url = 'https://docs.python.org'  # 定义基础链接
# 第二参数不完整时
print(urllib.parse.urljoin(base_url, '3/library/urllib.parse.html'))  # 第二参数完成时，直接返回第二参数的链接
print(urllib.parse.urljoin(base_url, 'https://docs.python.org/3/library/urllib.parse.html#url-parsing'))

base_url = 'http://httpbin.org/get?country='  # 定义基础链接
url = base_url + urllib.parsequote('中国')  # 字符串编码
print('编码后的请求地址为:', url)

u = urllib.parse.urlencode({'country:中国'})  # 使用urlencode编码
q = urllib.parse.quote('country=中国')  # 使用quote编码

base_url = 'http://httpbin.org/get?'  # 定义基础链接
params = {'name': 'Jack', 'country': '中国', 'age': 30}  # 定义字典类型的请求参数
url = base_url + urllib.parse.urlencode(params)  # 连接请求地址
print('编码后的请求地址为:', url)

print('urlencode编码后结果为:', u)
print('quote编码后结果为:', q)
print('对urlencode解码:', urllib.parse.unquote(u))
print('对quote解码:', urllib.parse.unquote(q))

# 定义一个请求地址
url = 'http://httpbin.org/get?name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30'
q = urllib.parse.urlsplit(url).query  # 获取参数
q_dict = urllib.parse.parse_qs(q)  # 将参数转换为字典类型的数据
print('数据类型为:', type(q_dict))
print('转换后的数据:', q_dict)

str_params = 'name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30'  # 字符串参数
list_params = urllib.parse.parse_qsl(str_params)  # 将字符串参数转为元组所组成的列表
print('数据类型为:', type(list_params))
print('转换后的数据:', list_params)
"""

"""
#正则表达式
pattern = 'mr_\w+'  # 模式字符串
string = 'MR_SHOP mr_shop'  # 要匹配的字符串
match = re.search(pattern, string, re.I)  # 搜索字符串，不区分大小写
print(match)  # 输出匹配结果
string = '项目名称MR_SHOP mr_shop'
match = re.search(pattern, string, re.I)  # 搜索字符串，不区分大小写
print(match)  # 输出匹配结果
# 表达式，(\d?)+表示多个数字可有可无，\s空格可有可无，([\u4e00-\u9fa5]?)+多个汉字可有可无
pattern = '(\d?)+mrsoft\s?([\u4e00-\u9fa5]?)+'
match = re.search(pattern, '01mrsoft')  # 匹配字符串，mrsoft前有01数字，匹配成功
print(match)  # 打印匹配结果
match = re.search(pattern, 'mrsoft')  # 匹配字符串，mrsoft匹配成功
print(match)  # 打印匹配结果
match = re.search(pattern, 'mrsoft')  # 匹配字符串，mrsoft后面有一个空格，匹配成功
print(match)  # 打印匹配结果
match = re.search(pattern, 'mrsoft 第一')  # 匹配字符串，mrsoft后面有空格和汉字，匹配成功
print(match)  # 打印匹配结果
match = re.search(pattern, 'rsoft 第一')  # 匹配字符串，rsoft后面有空格和汉字，匹配失败
print(match)  # 打印匹配结果

pattern = 'r\bmr\b'  # 表达式，mr两侧均有边界
match = re.search(pattern, 'mrsoft')  # 匹配字符串，mr右侧不是边界是soft，匹配失败
print(match)  # 打印匹配结果
match = re.search(pattern, 'mr soft')  # 匹配字符串，mr左侧为边界右侧为空格，匹配成功
print(match)  # 打印匹配结果
match = re.search(pattern, 'mrsoft ')  # 匹配字符串，mr左侧为空格右侧为soft空格，匹配失败
print(match)  # 打印匹配结果
match = re.search(pattern, 'mr.soft')  # 匹配字符串，mr左侧为边界右侧为“.”，匹配成功
print(match)  # 打印匹配结果

pattern = 'mr_\w+'  # 模式字符串
string = 'MR_SHOP mr_shop'  # 要匹配的字符串
match = re.findall(pattern, string, re.I)  # 搜索字符串，不区分大小写
print(match)  # 输出匹配结果
string = '项目名称MR_SHOP mr_shop'
match = re.findall(pattern, string)  # 搜索字符串，区分大小写
print(match)  # 输出匹配结果

pattern = 'https://.*/'  # 表达式，“.*”获取www.hao123.com
match = re.findall(pattern, 'https://www.hao123.com/')  # 匹配字符串
print(match)  # 打印匹配结果

pattern = 'https://.*(\d+).com/'  # 表达式，“.*”获取www.hao123.com
match = re.findall(pattern, 'https://www.hao123.com/')  # 匹配字符串
print(match)  # 打印匹配结果

pattern = 'https://.*?(\d+).com/'  # 表达式，“.*?”获取www.hao123.com
match = re.findall(pattern, 'https://www.hao123.com/')  # 匹配字符串
print(match)  # 打印匹配结果

pattern = 'https://(.*?)'  # 表达式，“*?”获取www.hao123.com/
match = re.findall(pattern, 'https://www.hao123.com/')  # 匹配字符串
print(match)  # 打印匹配结果
pattern = 'https://(.*)'  # 表达式，“.*”获取www.hao123.com/
match = re.findall(pattern, 'https://www.hao123.com/')  # 匹配字符串
print(match)  # 打印匹配结果

pattern = r'1[34578]\d{9}'  # 定义要替换的模式字符串
string = '中奖号码为:84978981 联系电话为:13611111111'
result = re.sub(pattern, '1xxxxxxxxxx', string)  # 替换字符串
print(result)

string = 'hk400 jhkj6h7k5 jhkjhk1j0k66'  # 需要匹配的字符串
pattern = '[a-z]'  # 表达式
match = re.sub(pattern, '', string, flags=re.I)  # 匹配字符串，将所有字母替换为空，并区分大小写
print(match)  # 打印匹配结果

# 需要匹配的字符串
string = 'John,I like you to meet Mr. Wang, Mr. Wang, this is our Sales Manager John. John, this is Mr. Wang.'
pattern = 'Wang'  # 表达式
match = re.subn(pattern, 'Li', string)  # 匹配字符串，将所有Wang替换为Li，并统计替换次数
print(match)  # 打印匹配结果
print(match[1])  # 打印匹配次数

pattern = r'[?|&]'  # 定义分割符
url = 'http://www.mingrisoft.com/login.jsp?username="mr"&pwd="mrsoft"'
result = re.split(pattern, url)  # 分割字符串
print(result)

# 需要匹配的字符串
string = '预定|K7577|CCT|THL|CCT|LYL|14:47|16:51|02:04|Y|'
pattern = '\|'  # 表达式
match = re.split(pattern, string, maxsplit=1)  # 匹配字符串，通过第一次出现的|进行分割
print(match)  # 打印匹配结果


# 定义视频播放页面的URL
url = 'http://site2.rikflm.com:666/index/index/view/id/1.html'  # 定义请求头信息
headers = {
    'User-Agent': 'Mozilla/5.0(Windows NT 10.0; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
response = requests.get(url=url, headers=headers)  # 发送网络请求
if response.status_code == 200:  # 判断请求成功后
    # 通过正则表达式匹配视频地址
    video_url = re.findall('<source src="(.*?)"type="video/mp4">', response.text)[0]
    video_url = 'http://site2.rjkflm.com:666/' + video_url  # 将视频地址拼接完整
video_response = requests.get(url=video_url, headers=headers)  # 发送下载视频的网络请求
if video_response.status_code == 200:  # 如果请求成功
    input = video_response.content  # 获取返回的视频二进制数据
    file = open('java视频.mp4', 'wb')  # 创建open对象
    file.write(input)  # 写入数据
    file.close()  # 关闭
"""
